package me.itsoo.artemis.framework.repository.mapper;

import me.itsoo.artemis.framework.repository.config.SqlConfigurable;
import me.itsoo.artemis.framework.repository.mapper.condition.AbstractCondition;
import me.itsoo.artemis.framework.repository.mapper.resource.AbstractResource;

import java.util.Collection;
import java.util.List;

/**
 * SqlMapper
 *
 * @param <T> T
 * @author zxy
 * @version 0.0.1
 * @since 2023/5/11
 */
public interface SqlMapper<T> extends SourceMapper, SqlConfigurable {

    /**
     * 查询数据对象
     *
     * @param pk Object
     * @return T
     */
    T selectOne(Object pk);

    /**
     * 查询数据列表
     *
     * @param pkColl Collection
     * @return Collection
     */
    List<T> select(Collection<?> pkColl);

    /**
     * 查询数据列表
     *
     * @param cond AbstractCondition
     * @return Collection
     */
    List<T> select(AbstractCondition cond);

    /**
     * 查询数据列表
     *
     * @param res  AbstractResource
     * @param cond AbstractCondition
     * @return Collection
     */
    List<T> select(AbstractResource res, AbstractCondition cond);

    /**
     * 插入数据对象
     *
     * @param dataObject T
     * @return rows
     */
    int insert(T dataObject);

    /**
     * 插入数据对象
     *
     * @param dataObject T
     * @return rows
     */
    int insertSelective(T dataObject);

    /**
     * 更新数据对象
     *
     * @param dataObject T
     * @return rows
     */
    int update(T dataObject);

    /**
     * 更新数据对象
     *
     * @param dataObject T
     * @return rows
     */
    int updateSelective(T dataObject);

    /**
     * 删除数据对象
     *
     * @param pkColl Collection
     * @return rows
     */
    int delete(Collection<?> pkColl);

    /**
     * 删除数据对象
     *
     * @param pk Object
     * @return rows
     */
    int delete(Object pk);

}
